作用域(Scope)是指在程式碼中變數(或函數等)的可訪問性和可見性的範圍,一個變量或表達式只在當前的作用域中可用,在其它地方是不可用的。作用域也可以構成層級結構,子作用域可以訪問父作用域,反之則不行。在開始講解作用域之前,我們先來看看今天會聊到的東西。
程式語言可分為以下兩種:
靜態作用域
動態作用域
JavaScript 屬於靜態作用域
,其作用範圍有以下三種:
全域作用域(Global Scope)
函式作用域(Function Scope)
區塊作用域(Block Scope)
靜態作用域
動態作用域
以下是比較靜態作用域
和動態作用域
的例子:
let x = 10;
function foo() {
// 如果是靜態作用域,那這個函數中的 x 的作用域是全局範圍
// 如果是動態作用域,那這個函數中的 x 的作用域取決於誰呼叫它
console.log(x);
}
function bar() {
let x = 20;
foo();
}
// 如果是靜態作用域,這裡會輸出 10
// 如果是動態作用域,這裡會輸出 20,因為 foo 函數是在 bar 函數中呼叫的,所以它使用了 bar 函數的 x 變數
bar();
前面有提到 JavaScript 是靜態作用域
,而其作用範圍有以下三種:全域作用域
, 函式作用域
, 區塊作用域
全域作用域(Global Scope)
函式作用域(Function Scope)
{}
內部)。var
是函式作用域。區塊作用域(Block Scope)
{}
定義的區域,如if語句、迴圈和函式。let
和 const
是區塊作用域。以下分別使用var
和let
,比較區塊作用域
和函式作用域
的例子:
function example() {
if(true) {
var myVarNum = 10; // 只能在 function 區塊內訪問 myLetNum
let myLetNum = 20; // 只能在 if 區塊內訪問 myLetNum
}
console.log(myVarNum); // 輸出 10
console.log(myLetNum); // 報錯
}
今天談了靜態作用域
和動態作用域
,
並說了JavaScript中的全域作用域
,函式作用域
和區塊作用域
,
希望寫得還算淺顯易懂。
那我們明天見。